import pytest
from longguo_ui.base.driver import Driver
from longguo_ui.utils.logger import logger
from longguo_ui.utils.screenshot import take_screenshot


@pytest.fixture(scope="function")
def driver():
    """
    全局driver夹具，函数级作用域（每个测试函数执行一次）
    负责初始化浏览器驱动、启动浏览器并导航到测试URL，测试结束后关闭浏览器

    :yield: 初始化好的WebDriver实例
    """
    logger.info("===== 开始UI自动化测试 =====")
    # 实例化驱动管理类
    driver_instance = Driver()
    # 获取浏览器驱动并打开测试页面
    driver = driver_instance.get_driver()
    # 提供驱动实例给测试用例
    yield driver
    # 测试结束后退出驱动
    driver_instance.quit_driver()
    logger.info("===== UI自动化测试结束 =====")


@pytest.fixture(autouse=True)
def log_test_case(request, driver):
    """
    自动执行的日志记录夹具，作用于所有测试用例
    负责记录测试用例的开始、结束状态，并在测试失败时自动截图

    :param request: pytest的请求对象，用于获取测试用例信息
    :param driver: WebDriver实例，用于失败时截图
    """
    # 获取当前测试用例名称
    test_name = request.node.name
    logger.info(f"----- 开始执行测试用例: {test_name} -----")

    # 执行测试用例
    yield

    # 检查测试结果（增加属性存在性判断，避免异常）
    if hasattr(request.node, 'rep_call'):
        if request.node.rep_call.failed:
            logger.error(f"----- 测试用例 {test_name} 执行失败 -----")
            # 失败时自动截图，以用例名为截图名称
            take_screenshot(driver, name=test_name)
        else:
            logger.info(f"----- 测试用例 {test_name} 执行成功 -----")
    else:
        logger.warning(f"----- 无法获取测试用例 {test_name} 的执行结果 -----")


@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    pytest钩子函数，用于捕获测试用例的执行结果
    将测试结果（setup/call/teardown阶段）存储到测试项的属性中，供其他夹具使用

    :param item: 测试项对象，代表一个测试用例
    :param call: 测试调用对象，包含测试执行的相关信息
    """
    # 执行钩子函数获取结果
    outcome = yield
    # 获取测试报告对象
    rep = outcome.get_result()
    # 将测试结果存储到测试项的属性中（如rep_setup/rep_call/rep_teardown）
    setattr(item, "rep_" + rep.when, rep)